package model;

import java.util.ArrayList;

import etresVivant.Proie;

public class Case {

	/**
	 * coordonnees d'une case
	 */
	private int x;
	private int y;
	
	/**
	 * contient l'instance de la proie si elle existe.
	 */
	private Proie proie;
	
	/**
	 * contiennent la quantite de phéromones pour une case
	 */
	private int pheromoneChasse;
	private int pheromoneReproduction;

	private boolean fourmiliere;
	private boolean bHasProie;

	public Case(int x, int y) {
		this(x, y, 0, 0, 0, false, false);
	}

	public Case(int x, int y, int pheroChasse, int pheroNettoyage,
			int pheroReproduction, boolean fourmiliere, boolean proie) {
		this.setX(x);
		this.setY(y);
		this.setPheromoneChasse(pheroChasse);
		this.setPheromoneReproduction(pheroReproduction);
		this.setFourmiliere(fourmiliere);
		this.setProie(proie);
	}

	/**
	 * @return the proieLibre
	 */
	public Proie getProie() {
		return proie;
	}

	/**
	 * @param proieLibre the proieLibre to set
	 */
	public void setProieLibre(Proie proieLibre) {
		this.proie = proieLibre;
	}
	
	public boolean isFourmiliere() {
		return fourmiliere;
	}

	public void setFourmiliere(boolean fourmiliere) {
		this.fourmiliere = fourmiliere;
	}

	/**
	 * @return the proie
	 */
	public boolean isProie() {
		return bHasProie;
	}

	/**
	 * @param proie
	 *            the proie to set
	 */
	public void setProie(boolean proie) {
		this.bHasProie = proie;
	}

	/**
	 * @return the x
	 */
	public int getX() {
		return x;
	}

	public void setX(int abscisse) {
		this.x = abscisse;
	}

	/**
	 * @return the y
	 */
	public int getY() {
		return y;
	}

	public void setY(int ordonnee) {
		this.y = ordonnee;
	}

	/**
	 * @return the pheromoneChasse
	 */
	public int getPheromoneChasse() {
		return pheromoneChasse;
	}

	/**
	 * @param pheromoneChasse
	 *            the pheromoneChasse to set
	 */
	public void setPheromoneChasse(int pheromoneChasse) {
		this.pheromoneChasse = pheromoneChasse;
	}

	/**
	 * @return the pheromoneReproduction
	 */
	public int getPheromoneReproduction() {
		return pheromoneReproduction;
	}

	/**
	 * @param pheromoneReproduction
	 *            the pheromoneReproduction to set
	 */
	public void setPheromoneReproduction(int pheromoneReproduction) {
		this.pheromoneReproduction = pheromoneReproduction;
	}

	/**
	 * 
	 * @return 0 si aucune pheromone sur la case sinon retourne la quantité de
	 * pheromone max présente (toute catégorie confondue)
	 */
	public int maxPheromone() {
		int phero = 0;

		if (pheromoneChasse > phero) {
			phero = pheromoneChasse;
		}
		if (pheromoneReproduction > phero) {
			phero = pheromoneReproduction;
		}

		return phero;
	}

	/**
	 * récupère les cases voisines possibles à this
	 * et les retourne sous forme d'une liste.
	 * @return liste des cases voisines
	 */
	public ArrayList<Case> casesVoisines() {
		int abscisse = this.getX();
		int ordonnee = this.getY();
		ArrayList<Case> casesVoisines = new ArrayList<Case>();

		if (abscisse == 0 && ordonnee == 0) {
			Case c1 = Terrain.getCase(abscisse + 1, ordonnee);
			Case c2 = Terrain.getCase(0, ordonnee + 1);
			casesVoisines.add(c1);
			casesVoisines.add(c2);
			return casesVoisines;
		}
		if (abscisse == Terrain.getNbColumn()-1 && ordonnee == 0) {
			Case c1 = Terrain.getCase(abscisse - 1, ordonnee);
			Case c2 = Terrain.getCase(abscisse, ordonnee + 1);
			casesVoisines.add(c1);
			casesVoisines.add(c2);
			return casesVoisines;
		}
		if (abscisse == 0 && ordonnee == Terrain.getNbLine()-1) {
			Case c1 = Terrain.getCase(abscisse + 1, ordonnee);
			Case c2 = Terrain.getCase(abscisse, ordonnee - 1);
			casesVoisines.add(c1);
			casesVoisines.add(c2);
			return casesVoisines;
		}
		if (abscisse == Terrain.getNbColumn()-1
				&& ordonnee == Terrain.getNbLine()-1) {
			Case c1 = Terrain.getCase(abscisse - 1, ordonnee);
			Case c2 = Terrain.getCase(abscisse, ordonnee - 1);
			casesVoisines.add(c1);
			casesVoisines.add(c2);
			return casesVoisines;
		}
		if (abscisse == 0) {
			Case c1 = Terrain.getCase(abscisse, ordonnee - 1);
			Case c2 = Terrain.getCase(abscisse, ordonnee + 1);
			Case c3 = Terrain.getCase(abscisse + 1, ordonnee);
			casesVoisines.add(c1);
			casesVoisines.add(c2);
			casesVoisines.add(c3);
			return casesVoisines;
		}
		if (abscisse == Terrain.getNbColumn()-1) {
			Case c1 = Terrain.getCase(abscisse, ordonnee - 1);
			Case c2 = Terrain.getCase(abscisse, ordonnee + 1);
			Case c3 = Terrain.getCase(abscisse - 1, ordonnee);
			casesVoisines.add(c1);
			casesVoisines.add(c2);
			casesVoisines.add(c3);
			return casesVoisines;
		}
		if (ordonnee == 0) {
			Case c1 = Terrain.getCase(abscisse + 1, ordonnee);
			Case c2 = Terrain.getCase(abscisse - 1, ordonnee);
			Case c3 = Terrain.getCase(abscisse, ordonnee + 1);
			casesVoisines.add(c1);
			casesVoisines.add(c2);
			casesVoisines.add(c3);
			return casesVoisines;
		}
		if (ordonnee == Terrain.getNbLine()-1) {
			Case c1 = Terrain.getCase(abscisse + 1, ordonnee);
			Case c2 = Terrain.getCase(abscisse - 1, ordonnee);
			Case c3 = Terrain.getCase(abscisse, ordonnee - 1);
			casesVoisines.add(c1);
			casesVoisines.add(c2);
			casesVoisines.add(c3);
			return casesVoisines;
		} else {
			Case c1 = Terrain.getCase(abscisse + 1, ordonnee);
			Case c2 = Terrain.getCase(abscisse - 1, ordonnee);
			Case c3 = Terrain.getCase(abscisse, ordonnee - 1);
			Case c4 = Terrain.getCase(abscisse, ordonnee + 1);
			casesVoisines.add(c1);
			casesVoisines.add(c2);
			casesVoisines.add(c3);
			casesVoisines.add(c4);
			return casesVoisines;
		}
	}
}